//
//  WWXLinkList.m
//  IMChat
//
//  Created by Admin on 2021/7/5.
//  Copyright © 2021年 TeamOne. All rights reserved.
//

#import "WWXLinkList.h"


@implementation WWXLinkList

//初始化
+(instancetype)initLinkList{
    WWXLinkList *LinkList = [[WWXLinkList alloc]init];
    LinkList.head = [WWXNode initNodeWithData:nil pre:nil next:nil];
    
    LinkList.last = nil;
    
    LinkList.N = 0;
    
    return LinkList;
}

//清空链表
-(void)clear{
    self.head.next = nil;
    self.head.pre = nil;
    self.head.data = nil;
    self.last = nil;
    self.N = 0;
}
//获取长度
-(int)length{
    return self.N;
}
//判断是否为空
-(Boolean)isEmpty{
    return self.N==0;
}
//获取第一个元素
-(instancetype) getFirst{
    if ([self isEmpty]) {
        return nil;
    }
    return self.head.next.data;
}
//获取最后一个元素
-(instancetype) getLast{
    if ([self isEmpty]) {
        return nil;
    }
    return self.last.data;
}
//插入元素
-(void)insertData:(id)data{
    if ([self isEmpty]) {
        //创建新的节点
        WWXNode *newNode = [WWXNode initNodeWithData:data pre:self.head next:nil];
        //让新结点成为尾结点
        self.last = newNode;
        //让头结点指向尾结点
        self.head.next = self.last;
    }else{
        //创建新的节点
        WWXNode *newNode = [WWXNode initNodeWithData:data pre:self.last next:nil];
        //让当前的尾结点指向新结点
        self.last.next = newNode;
        //让新结点成为尾结点
        self.last = newNode;
    }
    //元素个数加一
    self.N++;
}
//向指定位置i处插入元素
-(void)insertData:(id)data index:(int)i{
    //找到i位置的前一个结点
    WWXNode *pre = self.head;
    for (int index = 0; index<i; index++) {
        pre = pre.next;
    }
    //找到i位置的节点
    WWXNode *curr = pre.next;
    //创建新结点
    WWXNode *newNode = [WWXNode initNodeWithData:data pre:pre next:curr];
    //让i位置的前一个结点的下一个结点变为新结点
    pre.next = newNode;
    //让i位置的前一个结点变为新结点
    curr.pre = newNode;
    //元素个数加一
    self.N++;
}
//获取指定位置i处的元素
-(id)get:(int)i{
    WWXNode *n = self.head.next;
    for (int index=0; index<i; index++) {
        n=n.next;
    }
    return n.data;
}
//找到元素data在链表中第一次出现的位置
-(int)indexOfData:(id)data{
    WWXNode *n = self.head;
    for (int i=0; n.next!=nil; i++) {
        n=n.next;
        if (n.data == data) {
            return i;
        }
    }
    return -1;
}
//删除位置i处的元素，并返回该元素
-(instancetype)removeData:(int)i{
    //找到i位置的前一个结点
    WWXNode *pre = self.head;
    for (int index = 0; index<i; index++) {
        pre = pre.next;
    }
    //找到i位置的结点
    WWXNode *curr = pre.next;
    //找到i位置的下一个结点
    WWXNode *next = curr.next;
    //让i位置的上一个结点的下一个结点变为i位置的下一个结点
    pre.next = next;
    //让i位置的下一个结点的上一个结点变为i位置的上一个结点
    next.pre = pre;
    //元素个数减一
    self.N--;
    //返回该元素
    return curr.data;
}

//转成数组
-(NSMutableArray*)toMutableArray{
    NSMutableArray *groupArr = [[NSMutableArray alloc]init];
    for (int i=0; i<[self length]; i++) {
        [groupArr addObject:[self get:i]];
    }
    return groupArr;
}

//打印方法（用于测试）
-(void)printLinkList{
    WWXNode *curr = self.head;
    for (int i = 0; i<=self.N; i++) {
        NSLog(@"%@",curr.data);
        curr = curr.next;
    }
}
@end
